package com.baixun.gassystem.service.impl;

import com.alibaba.excel.EasyExcel;
import com.baixun.gascommon.annotation.DataPermission;
import com.baixun.gasentity.dto.AlarmDTO;
import com.baixun.gasentity.dto.AlarmStatisticsDTO;
import com.baixun.gasentity.dto.AlarmTrendDTO;
import com.baixun.gassystem.mapper.AlarmMapper;
import com.baixun.gassystem.service.AlarmService;
import com.baixun.gassystem.service.ApiService;
import com.baixun.gassystem.service.HomePageService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @program: 上海燃气驾驶舱
 * @description: 报警列表实现类
 * @author: yesong
 **/

@Service
public class AlarmServiceImpl implements AlarmService {

    @Autowired
    private AlarmMapper alarmMapper;





    /**
     * 报警列表分页查询
     */
    @Override
    public IPage<AlarmDTO> selectAlarmList(AlarmDTO requestDTO) {
        List<AlarmDTO> alarmDTOS = alarmMapper.selectAlarmList(requestDTO);
        return (IPage<AlarmDTO>) alarmDTOS;
    }


    /**
     * 无人机列表展示
     * @param requestDTO
     * @return
     */
    @Override
    public IPage<AlarmDTO> selectUavList(AlarmDTO requestDTO) {
        List<AlarmDTO> UavDTOS = alarmMapper.selectUavTypeList(requestDTO);
        return (IPage<AlarmDTO>) UavDTOS;
    }


    /**
     * 执法仪列表展示
     */
    @Override
    public IPage<AlarmDTO> selectFaList(AlarmDTO requestDTO) {
        List<AlarmDTO> FaDTOS = alarmMapper.selectFaList(requestDTO);
        return (IPage<AlarmDTO>) FaDTOS;
    }

    @Override
    public void exportAlarmList(AlarmDTO requestDTO, ServletOutputStream outputStream) {
        List<AlarmDTO> alarmDTOS = (List<AlarmDTO>) selectAlarmList(requestDTO);
        if (CollectionUtils.isEmpty(alarmDTOS)){
            throw new RuntimeException("没有找到符合条件的报警记录");
        }
        // 将查询的数据转换为导出对象
        List<AlarmDTO> exportData = alarmDTOS.stream().map(alarm -> {
            // 创建一个AlarmDTO对象，用于导出报警信息
            AlarmDTO exportVO = new AlarmDTO();
            // 设置事件ID，以便在导出视图中标识特定的报警事件
            exportVO.setEventId(alarm.getEventId());
            // 设置捕获时间，将时间转换为字符串格式以便于显示
            exportVO.setCaptureTime(alarm.getCaptureTime().toString());
            // 设置车站信息，指明报警事件发生的地点
            exportVO.setStation(alarm.getStation());
            // 设置事件类型，定义报警的种类
            exportVO.setEventType(alarm.getEventType());
            // 设置裁剪快照URL，提供报警事件的视觉证据链接
            exportVO.setCropSnapshotUrl(alarm.getCropSnapshotUrl());
            exportVO.setVideoUrl(alarm.getVideoUrl());
            // 返回配置好的导出视图对象，提供给上层调用者
            return exportVO;
        }).collect(Collectors.toList());

        EasyExcel.write(outputStream, AlarmDTO.class).sheet("报警列表").doWrite(exportData);
    }

    @Override
    public void exportUvaToExcel(ServletOutputStream outputStream, AlarmDTO requestDTO) {
        List<AlarmDTO> UavDTOS = (List<AlarmDTO>) selectUavList(requestDTO);
        if (CollectionUtils.isEmpty(UavDTOS)){
            throw new RuntimeException("没有找到符合条件的无人机操作记录");
        }

        //将查询的数据转换为导出对象
        List<AlarmDTO> exportData = UavDTOS.stream().map(uav -> {
            AlarmDTO exportVO = new AlarmDTO();

            exportVO.setCropSnapshotUrl(uav.getCropSnapshotUrl());
            exportVO.setUavType(uav.getUavType());
            exportVO.setCropSnapshotUrl(uav.getCropSnapshotUrl());
            return exportVO;
        }).collect(Collectors.toList());

        // 使用 EasyExcel 导出数据到 Excel
        EasyExcel.write(outputStream, AlarmDTO.class).sheet("无人机操作记录").doWrite(exportData);
    }

    @Override
    public void exportFaToExcel(ServletOutputStream outputStream, AlarmDTO requestDTO) {
        List<AlarmDTO> FaDTOS = (List<AlarmDTO>) selectFaList(requestDTO);
        if (CollectionUtils.isEmpty(FaDTOS)){
            throw new RuntimeException("没有找到符合条件的执法仪操作记录");
        }
        // 将查询的数据转换为导出对象
        List<AlarmDTO> exportData = FaDTOS.stream().map(fa -> {
            // 创建一个AlarmDTO对象，用于导出报警信息
            AlarmDTO exportVO = new AlarmDTO();
            // 设置事件ID，以便在导出视图中标识特定的报警事件
            exportVO.setEventId(fa.getEventId());
            // 设置捕获时间，将时间转换为字符串格式以便于显示
            exportVO.setCaptureTime(fa.getCaptureTime().toString());
            // 设置车站信息，指明报警事件发生的地点
            exportVO.setStation(fa.getStation());
            // 设置事件类型，定义报警的种类
            exportVO.setEventType(fa.getEventType());
            // 设置裁剪快照URL，提供报警事件的视觉证据链接
            exportVO.setCropSnapshotUrl(fa.getCropSnapshotUrl());
            exportVO.setVideoUrl(fa.getVideoUrl());
            // 返回配置好的导出视图对象，提供给上层调用者
            return exportVO;
    }).collect(Collectors.toList());
        EasyExcel.write(outputStream, AlarmDTO.class).sheet("执法仪操作记录").doWrite(exportData);
    }


    /**
     * 报警统计
     * @return
     */

    @Override
    public List<AlarmStatisticsDTO> getAlarmStatistics() {
        return alarmMapper.getAlarmStatistics();
    }

    @Override
    public List<AlarmStatisticsDTO> getVideoStatistics() {
        return alarmMapper.getVideoStatistics();
    }

    @Override
    public List<AlarmStatisticsDTO> getDroneStatistics() {
        return alarmMapper.getDroneStatistics();
    }

    @Override
    public List<AlarmStatisticsDTO> getFaStatistics() {
        return alarmMapper.getFaStatistics();
    }

    /**
     * 报警趋势
     */
    @Override
    public List<AlarmTrendDTO> getAlarmTrend(String startTime, String endTime) {
        return alarmMapper.getAlarmTrend(startTime,endTime);
    }

    @Override
    public List<AlarmTrendDTO> getVideoTrend(String startTime, String endTime) {
        return alarmMapper.getVideoTrend(startTime,endTime);
    }

    @Override
    public List<AlarmTrendDTO> getDroneTrend(String startTime, String endTime) {
        return alarmMapper.getDroneTrend(startTime,endTime);
    }

    @Override
    public List<AlarmTrendDTO> getFaTrend(String startTime, String endTime) {
        return alarmMapper.getFaTrend(startTime,endTime);
    }
}
